package com.java.comprehensive.arithmetic.programmers;

import cn.hutool.core.util.ArrayUtil;
import com.java.comprehensive.util.SortUtils;

/**
 * @Author: 窦绍飞
 * @Date: 2022/5/9
 */
public class Rotate {
	public static void rotate(int[][] matrix) {
		int length = matrix.length;
		int[][] temp = new int[length][length];
		int ii = length;
		int ll = 0;
		for (int i = length - 1; i >= 0; i--) {
			for (int j = 0; j < length; j++) {
				int l = length - ii;
				temp[l][ll] = matrix[i][j];
				ii--;
			}
			ll++;
			ii = length;
		}
		System.arraycopy(temp, 0, matrix, 0, matrix.length);
	}

	public static void rotateTwo(int[][] matrix) {
		int n = matrix.length;

		//对折交换
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < i; j++) {
				// 当i=1的时候让 [0,1] 和 [1,0] 交换
				// 当i=2的时候让 [0,2] 和 [2,0] 交换
				// 循环类推 完成 对折
				SortUtils.swap(matrix, i, j, j, i);
			}
		}

		//左右翻转
		for (int i = 0; i < n; i++) {

			//左右翻转 不需要只需要循环一半就代表全部换过位置了 所以n/2 ，并且 中间不用交换不需要<=
			//用长度 - 当前需要交换的元素小标 - 1(因为 数组从零开始 ) 就可以得到左边对应的需要交换右边元素的位置
			for (int j = 0; j < n / 2; j++) {
				SortUtils.swap(matrix, i, j, i, n - j - 1);
			}

		}

	}

	public static void main(String[] args) {
		int[][] matrix = {{1, 2, 3},
				{4, 5, 6},
				{7, 8, 9}};
		//对折
		//		{1, 4, 7}
		//		{2, 5, 8}
		//		{3, 6, 9}

		//左右翻转
		//		{7, 4, 1}
		//		{8, 5, 2}
		//		{9, 6, 3}
		rotateTwo(matrix);
		System.out.println(ArrayUtil.toString(matrix));
	}


}
